package com.leyou.search.pojo;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Map;
import java.util.Set;

/**
 * 商品索引库对象
 */
@Data
@Document(indexName = "goods",type="docs",shards=5,replicas=1)
public class Goods {
    @Id
    private Long id;//tb_spu表的spuId

    //tb_spu表的name 注意：该字段进行索引和分词是为了高亮显示！！！
    @Field(type= FieldType.Text,analyzer = "ik_max_word")
    private String spuName;

    //设计一个字段存放所有参与搜索的条件数据
    //all包含tb_spu的name + tb_spu的sub_title + 所有sku的title 索引，分词
    @Field(type=FieldType.Text,analyzer = "ik_max_word")
    private String all;

    //tb_spu表的sub_title  不索引，不分词
    @Field(type = FieldType.Keyword,index = false)
    private String subTitle;

    //设计用于存储所有的Sku的数据
    //注意：在ES中如果是集合类型（List,Map等）,集合中的每个对象/属性，都是默认索引，不分词的！！！
    //所以集合该String
    @Field(type = FieldType.Keyword,index =false)
    private String skus;//skus存储的是List<Sku>转换而来的json字符串，控制该字符串不索引，不分词，效率更高!

    //当前商品的分类ID
    @Field(type = FieldType.Long)
    private Long categoryId;//注意：一个Goods只需要存储一个分类ID，分类过滤条件的列表是靠所有Goods结果聚合而来的

    //当前商品品牌的品牌ID
    //注意：一个Goods只需要存储一个品牌ID，品牌过滤条件的列表是靠所有Goods结果聚合而来的
    @Field(type=FieldType.Long)
    private Long brandId;//注意，字段名称开头不能大写，即不能写成这样：BrandId

    //规格参数  注意：该Map的参数值，来自指定分类下的用于搜索的规格参数（tb_spec_param where cid=? and searching=true）,
    //Map集合默认都是索引不分词的，刚好需要被聚合，所以要索引
    @Field(type=FieldType.Object)
    private Map<String,Object> specs;

    //存放商品上架时间
    @Field(type = FieldType.Long)
    private Long createTime; //用于排序的，索引不分词

    //商品价格
    //注意：使用Set比较方便去排序   索引不分词
    @Field(type = FieldType.Long)
    private Set<Long> price;

}
